package Ep04_String.LC_0003;

import java.util.HashMap;

/**
 * @author Jimmy Zhan WORKSTATION
 * @since 2023/7/11 17:28
 * 说明：
 */

public class Mine {
    public static void main(String[] args) {
        Mine m = new Mine();
        System.out.println(m.lengthOfLongestSubstring("abba"));
    }

    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 0) return 0;
        if (s.length() == 1) return 1;
        HashMap<Character, Integer> map = new HashMap<>();
        int left = 0;
        int max = 0;
        for (int i = 0; i < s.length(); ++i) {
            if (map.containsKey(s.charAt(i))) {
                // 如 abba，如果只取 map.get(s.charAt(i)) + 1，那么相当于把left指针置在第一个a后一位了，这样显然是扩大了域
                // 事实上，如果当前left比map.get(s.charAt(i)) + 1更大，那么我们是不需要改变left的位置的。
                left = Math.max(left, map.get(s.charAt(i)) + 1);
            }
            map.put(s.charAt(i), i);
            max = Math.max(max, i - left + 1);  // 当前窗口大小 i- left + 1，与历史max取最大值
        }
        return max;
    }
}
